/*
 * Mysql-backed implementation of the comment interface.
 * Needs the following table:
 * 
 * CREATE TABLE  `webdb`.`commento` (
 * `ID` int(10) unsigned NOT NULL auto_increment,
 * `commento` text NOT NULL,
 * `IDutente` int(10) unsigned NOT NULL,
 * `IDfoto` int(11) NOT NULL,
 * PRIMARY KEY  (`ID`)
 * );
 * 
 */
package it.univaq.f4i.iw.ex.album.model.impl;

import it.univaq.f4i.iw.ex.album.model.Comment;
import it.univaq.f4i.iw.ex.album.model.Photo;
import it.univaq.f4i.iw.ex.album.model.User;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CommentMysqlImpl implements Comment {

    private String text;
    private int key;
    private User user;
    private Photo photo;
    //proprietà non esposte dall'interfaccia, usate solo per questa implementazione
    //these properties are not available to the user, but only to the implementation
    //chiave esterna verso il record dell'utente proprietario
    //foreign key to the owner record
    private int user_key;
    private int photo_key;
    private PhotoAlbumDataLayerMysqlImpl datalayer;

    //notare che i costruttori che seguono sono entrambi
    //package-private, cioè possono essere richiamati
    //solo da classi all'interno dello stesso package
    //(tra cui le API del modello dati), ma risultano
    //invisibili all'utente (che non può usare quindi la
    //new per creare istanze di questa classe)
    //costrutture "vuoto" usato per inizializzare gli oggetti
    //notare che queste classi hanno bisogno di un riferimento
    //alle API del modello dati per eseguire alcune operazioni
    // note that following constructors are
    // package-private, i.e., they can be called
    // only by classes in the same package
    // (including the data layer class), but are
    // invisible to the user (the operator new cannot be
    // used to create instances of this class)
    //  this is an "empty" constructor 
    // note that these classes need a reference
    // to the data layer API to perform some operations
    CommentMysqlImpl(PhotoAlbumDataLayerMysqlImpl datalayer) {
        text = "";
        key = 0;
        user_key = 0;
        photo_key = 0;
        user = null;
        photo = null;
        this.datalayer = datalayer;
    }

    //costrutture "helper" che crea un oggetto e lo imposta
    //in base ai valori dei campi nel record corrente di
    //un ResultSet - utile per creare oggetti a partire
    //dai risultati di una query
    //helper constructor which creates an object
    //and sets its contents according to the fields
    //of the current record in the given ResultSet - 
    //useful to create objects from query results
    CommentMysqlImpl(PhotoAlbumDataLayerMysqlImpl datalayer, ResultSet data) throws SQLException {
        key = data.getInt("ID");
        text = data.getString("commento");
        user_key = data.getInt("IDutente");
        photo_key = data.getInt("IDfoto");
        this.datalayer = datalayer;
    }

    /**
     * @return the text
     */
    public String getText() {
        return text;
    }

    /**
     * @param text the text to set
     */
    public void setText(String text) {
        this.text = text;
    }

    /**
     * @return the key
     */
    public int getKey() {
        return key;
    }

    /**
     * @param key the key to set
     */
    public void setKey(int key) {
        this.key = key;
    }

    /**
     * @return the utente
     */
    //questo getter implementa una politica di
    //caricamento "lazy" dell'utente aggregato
    //(il caricamento avviene alla prima chiamata
    //al metodo)
    //this getter implements a "lazy loading" policy
    //for the linked user: it is loaded 
    //only when this method is first called
    public User getUser() {
        if (user == null) {
            user = datalayer.getUser(user_key);
        }
        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(User user) {
        this.user = user;
    }

    /**
     * @return the photo
     */
    //questo getter implementa una politica di
    //caricamento "lazy" della foto aggregata
    //(il caricamento avviene alla prima chiamata
    //al metodo)
    //this getter implements a "lazy loading" policy
    //for the linked photo: the photo is loaded 
    // only when this method is first called
    public Photo getPhoto() {
        if (photo == null) {
            photo = datalayer.getPhoto(photo_key);
        }
        return photo;

    }

    /**
     * @param photo the photo to set
     */
    public void setPhoto(Photo photo) {
        this.photo = photo;
    }
}
